// ==UserScript==
// @name         微博快速查看IP属地
// @namespace    https://weibo.com/
// @version      1.0
// @description  帮你快速在微博上查看IP属地, 安装此脚本后，只要把鼠标悬停在用户名上，弹出的用户卡片中就会显示用户的IP属地
// @author       普通的程序员
// @match        *://weibo.com/*
// @match        *://*.weibo.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=weibo.com
// @grant        none
// @updateURL    https://gitee.com/lightrabbit/weibo-ip-region-view/raw/master/view-region.user.js
// @downloadURL    https://gitee.com/lightrabbit/weibo-ip-region-view/raw/master/view-region.user.js
// ==/UserScript==

const 用户节点集合 = new WeakSet();

async function 获取IP属地(uid) {
    const 响应 = await fetch(`/ajax/profile/detail?uid=${uid}`);
    const 用户信息 = await 响应.json();
    const IP属地 = 用户信息.data.ip_location;
    return IP属地;
}

function 增加IP属地节点(用户卡片) {
    const 节点 = document.createElement('div');
    节点.classList.add('woo-box-flex', 'woo-box-alignCenter', 'PopCard_t21_1vZO0');
    节点.innerText = '<ip属地>';
    const 卡片内容节点 = 用户卡片.querySelector('.woo-box-flex.woo-box-column.woo-box-alignCenter.woo-box-justifyBetween');
    卡片内容节点.insertBefore(节点, 卡片内容节点.children[1]);
    return 节点;
}

function 获取UID(用户卡片) {
    const 链接 = 用户卡片.querySelector('.PopCard_alink_LHzuI').href;
    const uid = /u\/page\/follow\/(\d+)\?/.exec(链接)?.[1];
    return uid;
}

let IP属地节点 = null;
let 用户卡片节点 = null;
let 上次uid = null;

async function 节点改变处理器([更改记录]) {
    const 发生更改的节点 = 更改记录.target;
    const 用户卡片 = 发生更改的节点.querySelector('.popcard');
    if (用户卡片) {
        // 如果获取到用户卡片，说明页面上重新创建了一个新的用户卡片，需要向其增加显示IP属地的节点
        IP属地节点 = 增加IP属地节点(用户卡片);
        用户卡片节点 = 用户卡片;
    }
    if (用户卡片节点) {
        const uid = 获取UID(用户卡片节点);
        console.log('当前获取到的uid', uid);
        if (uid && uid != 上次uid) {
            console.log('检测到UID改变，获取属地中');
            上次uid = uid;
            IP属地节点.innerText = 'IP属地：获取中...';
            const IP属地 = await 获取IP属地(uid) || '未获取到属地信息';
            if (IP属地) {
                IP属地节点.innerText = IP属地;
            }
        }
    }
}
(function() {
    'use strict';

    console.log('程序启动');
    用户卡片节点 = document.querySelector('.popcard');
    IP属地节点 = 增加IP属地节点(用户卡片节点);

    var 观察者 = new MutationObserver(节点改变处理器);
    观察者.observe(document.body, {childList:true, subtree:true});
})();